package com.sunday.authorization.mock.oauth2.client.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(ClientRegistrationRepository clientRegistrationRepository, HttpSecurity http) throws Exception {
        /**
         * 在Spring Security中，.oauth2Login(Customizer.withDefaults()) 和 .oauth2Client(Customizer.withDefaults()) 是两个不同的配置，分别用于处理不同的OAuth2流程。让我们分别看一下它们的用途和涉及的URL。
         *
         * 1. .oauth2Login(Customizer.withDefaults())
         * 用途
         * 这个配置用于基于OAuth2的登录（Authorization Code Grant）。通常使用在用户通过第三方身份提供者（如Google, GitHub）登录你的应用。这是涉及用户的互动登录流程。
         * 涉及的URL
         * 一般情况下，这个配置会涉及到以下一些URL：
         * /oauth2/authorization/{registrationId}: 用户点击登录按钮之后，引导用户到第三方身份提供者进行身份认证的URL。
         * /login/oauth2/code/{registrationId}: 第三方身份提供者完成身份验证后，重定向回该URL，并带有授权码。
         * /oauth2/authorize 和 /oauth2/authorize/code/*: 用于处理OAuth2授权和登录结果。
         *
         * 2. .oauth2Client(Customizer.withDefaults())
         * 用途
         * 这个配置用于OAuth2客户端凭证模式（Client Credentials Grant）或者用于后端与OAuth2服务提供者之间的交互，获取访问令牌，用于访问受保护的资源。这不会涉及到具体的用户互动，而是后端应用程序与服务之间的交互。
         * 涉及的URL
         * 这个配置通常涉及到如下一些URL：
         * /oauth2/token: 用于获取访问令牌。
         * /oauth2/jwks: 用于访问JSON Web Key Set，用来验证JWT。
         * 其它相关后端API URL，用于获取、刷新和使用OAuth2 token。
         *
         * 总结
         * .oauth2Login(Customizer.withDefaults()) 是用于处理用户基于OAuth2登录的配置。
         * .oauth2Client(Customizer.withDefaults()) 是用于后端系统作为OAuth2客户端获取访问令牌并访问受保护资源的配置。
         * 希望这能帮助你更清楚地理解这两个配置的区别和它们各自的作用。如果你还有其他问题，随时可以问我。
         */
        http
                .oauth2Login(Customizer.withDefaults())
                .oauth2Client(Customizer.withDefaults())
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/home1").authenticated()
                        .anyRequest().permitAll());
        return http.build();

    }


}